package $1_2processcontrol;

public class SwitchClass {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// switch语句根据switch (表达式)计算的结果，跳转到匹配的case结果，然后继续执行后续语句，直到遇到break结束执行。
		// 给switch语句加一个default，当没有匹配到任何case时，执行default
		// 使用switch时，注意case语句并没有花括号{}，而且，case语句具有“穿透性”，漏写break将导致意想不到的结果
        int option = 2;
        switch (option) {
        case 1:
            System.out.println("Selected 1");
            break;
        case 2:
        case 3:
            System.out.println("Selected 2, 3");  //任何时候都不要忘记写break。如果有几个case语句执行的是同一组语句块，可以这么写
            break;
        default:
            System.out.println("Not selected");
            break;
        }
        // 使用switch时，如果遗漏了break，就会造成严重的逻辑错误，而且不易在源代码中发现错误。
		
		// switch语句还可以匹配字符串。字符串匹配时，是比较“内容相等”。
        String fruit = "apple";
        switch (fruit) {
        case "apple":
            System.out.println("Selected apple");
            break;
        case "pear":
            System.out.println("Selected pear");
            break;
        case "mango":
            System.out.println("Selected mango");
            break;
        default:
            System.out.println("No fruit selected");
            break;
        }
        // 我们还可能用switch语句给某个变量赋值。
        int opt;
        switch (fruit) {
        case "apple":
            opt = 1;
            break;
        case "pear":
        case "mango":
            opt = 2;
            break;
        default:
            opt = 0;
            break;
        }
        System.out.println("opt="+opt);  //opt=1
        
        // 从Java 12开始，switch语句升级为更简洁的表达式语法
        // 使用类似模式匹配（Pattern Matching）的方法，保证只有一种路径会被执行，并且不需要break语句
        // 注意新语法使用->，如果有多条语句，需要用{}括起来。不要写break语句，因为新语法只会执行匹配的语句，没有穿透效应。
        fruit = "pear";
        switch (fruit) {
        case "apple" -> System.out.println("Selected apple");
        case "pear" -> System.out.println("Selected pear");
        case "mango" -> {
            System.out.println("Selected mango");
            System.out.println("Good choice!");
        }
        default -> System.out.println("No fruit selected");
        }
        // 使用新的switch语法，不但不需要break，还可以直接返回值。
        int opt1 = switch (fruit) {
            case "apple" -> 1;
            case "pear", "mango" -> 2;
            default -> 0;
        }; // 注意赋值语句要以;结束
        System.out.println("opt1 = " + opt1);		//opt1 = 2
        
        //如果需要复杂的语句，我们也可以写很多语句，放到{...}里，然后，用yield返回一个值作为switch语句的返回值
        fruit = "orange";
        int opt2 = switch (fruit) {
            case "apple" -> 1;
            case "pear", "mango" -> 2;
            default -> {
                int code = fruit.hashCode();
                yield code; // switch语句返回值
            }
        };
        System.out.println("opt2 = " + opt2);		//opt2 = -1008851410
        
        // switch实现石头/剪子/布并判断胜负
		System.out.println("please choice:");
		System.out.println(" 1: Rock");
		System.out.println(" 2: Scissors");
		System.out.println(" 3: Paper");
		// 用户输入:
		int choice = 0;
		// choice = 2;
		// 计算机随机数 1, 2, 3:
		double dbnum = Math.random();
		int random = 1 + (int) (dbnum * 3);
		System.out.println("you: "+ choice);
		System.out.println("computer: "+ random);
		
		switch (choice) {
		case 1:
			if(choice == random){
				System.out.println("draw.");
			}else if(choice < random){
				System.out.println("you win.");
			}else if(choice > random){
				System.out.println("you lose.");
			}
			
			break;
		case 2:
			if(choice == random){
				System.out.println("draw.");
			}else if(choice < random){
				System.out.println("you win.");
			}else if(choice > random){
				System.out.println("you lose.");
			}
			
			break;
		case 3:
			if(choice == random){
				System.out.println("draw.");
			}else if(choice < random){
				System.out.println("you win.");
			}else if(choice > random){
				System.out.println("you lose.");
			}
			
			break;
		default :
			System.out.println("your input is wrong.");
			break;
		}
		System.out.println("Game over.");
        
	}

}
